package com.zdp.netty.bytebuf;

import com.zdp.util.Logger;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import org.junit.Test;

import static com.zdp.netty.bytebuf.PrintAttribute.print;


/**
 * Netty 中 ByteBuf的操作示例
 * @author Zhengdp
 * @date 2022年12月14日 13:58
 */
public class ByteBufOperationTest {

    /**
     * ByteBuff 的 引用计数测试
     * retain() : 引用计数+1
     * release() : 引用技术-1
     * retain() 和 release()应该结对使用
     * ByteBuf 实例对象被创建，引用计数=1
     */
    @Test
    public  void testRef()
    {
        ByteBuf buffer  =ByteBufAllocator.DEFAULT.buffer();
        Logger.info("after create:"+buffer.refCnt());
        buffer.retain();
        Logger.info("after retain:"+buffer.refCnt());
        buffer.release();
        Logger.info("after release:"+buffer.refCnt());
        buffer.release();
        Logger.info("after release:"+buffer.refCnt());
        //错误：refCnt: 0，不能再retain
        buffer.retain();
        Logger.info("after retain:"+buffer.refCnt());
    }

    /**
     * ByteBuf 的读写测试
     */
    @Test
    public void writeReadTest(){
        // 1. 分配一个 ByteBuf实例
        // 9:capacity  100:maxCapacity
        ByteBuf buf  = ByteBufAllocator.DEFAULT.buffer(9,100);
        print("动作：分配 ByteBuf(9,100)",buf);
        buf.writeBytes(new byte[]{1,2,3,4});
        print("动作：写入4个字节(1,2,3,4)",buf);
        Logger.info("start ====================== : get =============");
        getByteBuf(buf);
        print("动作：取数据ByteBuf ",buf);
        Logger.info("start ===============: read ===============");
        readByteBuf(buf);
        print("动作：读完ByteBuf",buf);
    }

    /**
     * 取ByteBuf字节，改变指针
     * @param buf
     */
    private void readByteBuf ( ByteBuf buf) {
        while(buf.isReadable()){
            Logger.info("取一个字节 :" + buf.readByte());
        }
    }

    /**
     * 读ByteBuf的字节，不改变指针
     * @param buf
     */
    private void getByteBuf(ByteBuf buf) {
        for(int i = 0; i < buf.readableBytes();i++){
            Logger.info("读一个字节 : " + buf.getByte(i));
        }
    }

}
